// 联合类型(只能选择指定类型)
let a: '男' | '女';
a = '男';
a = '女';

// 规定变量的类型
// | 符号为或表示两个都可以
let b: boolean | string;

// any是任意类型,可以赋值给任意类型,不建议使用
let c: any;
c = '123';
c = 123;
c = true;

// unknow 表示未知的类型
let d: unknown;
d = '123';
d = 123;
d = true;

// 注意any类型可以赋值给任意类型,unknown不能赋值给任意类型除非指定类型(断言)
let e: string;
e = c;
// 断言两种方式(指定未知类型的类型)
e = d as string;
e = <string>d;

// 函数返回值类型
// void 没有返回值
function testA(): void {
	console.log('222');
}
// never 不能是任意值
function testB(): never {
	throw new Error('我报错了');
}

// object对象类型
// f 是一个对象类型且需要包含name字符串类型,?代表可选
let f: {name: string; age?: number};
f = {name: '123'};
f = {name: '123', age: 12};
// g是一个对象类型且需要包含name字符串类型,以及后续任意类型
let g: {name: string; [propName: string]: any};
g = {name: '123', age: 12, sex: true};

// 定义函数类型
// h是一个函数类型参数为数字类型的a,b,返回值为数字类型
let h: (a: number, b: number) => number;
h = function (n1, n2): number {
	return n1 + n2;
};

// 数组类型
let i: string[];
i = ['123', '22', '33'];
let j: Array<string>;
j = ['123', '22', '33'];

// 元祖 固定长度和类型
let k: [string, number];
k = ['222', 123];

// 枚举
enum Gender {
	Male,
	Female,
}
// 指定类型增加阅读性
let l: {name: string; sex: Gender};
l = {name: '孙悟空', sex: Gender.Male};

// &表示同时
let m: {name: string} & {age: number};
m = {name: '孙悟空', age: 123};

// 别名
type myType = 1 | 2 | 3 | 4;
let n: myType;
